package hotel.mensagens;

import java.text.ParseException;
import java.text.SimpleDateFormat;

import o2b.IStream;
import o2b.MarshallableException;
import hotel.tipos.Reserva;

public class ManterReserva extends Mensagem {

	protected Reserva reserva;
	/**
	 *  1 - cadastrar reserva;
	 *   11 - resposta cadastrar reserva OK
	 *   12 - resposta cadastrar reserva NOK
	 *   13 - resposta cadastrar reserva APTO OCUPADO
	 *	2 - procurar reserva;
	 *   21 - resposta procurar reserva OK
	 *   22 - resposta procurar reserva NOK
	 *	3 - alterar reserva ; 
	 *	 31 - resposta alterar reserva OK
	 *	 32	- resposta alterar reserva NOK
	 *	4 - apagar reserva;
	 *	 41 - resposta apagar reserva OK
	 *	 42 - resposta apagar reserva NOK
	 *  5 - confirmar reserva
	 *   51 - confirmar reserva OK
	 *   52 - confirmar reserva NOK
	 *   
	**/
	private int tipoManterReserva; 
	private String nomeDoHospede;
	
	/**
	 * Construtor padrão
	 */
	public ManterReserva() {
		tipo = TipoMensagem.MANTERRESERVA;
		setReserva(new Reserva());
	}
	
	/**
	 * 
	 * @param tipoManterReserva
	 *  1 - cadastrar reserva;
	 *   11 - resposta cadastrar reserva OK,
	 *   12 - resposta cadastrar reserva NOK,
	 *   13 - resposta cadastrar reserva AP OCUPADO,
	 *	2 - procurar reserva;
	 *   21 - resposta procurar reserva OK,
	 *   22 - resposta procurar reserva NOK,
	 *	3 - alterar reserva; 
	 *	 31 - resposta alterar reserva OK,
	 *	 32	- resposta alterar reserva NOK,
	 *	4 - apagar reserva;
	 *	 41 - resposta apagar reserva OK,
	 *	 42 - resposta apagar reserva NOK,
	 *  5 - confirmar reserva;
	 *   51 - confirmar reserva OK,
	 *   52 - confirmar reserva NOK,
	 */
	public ManterReserva(int tipoManterReserva) {
		tipo = TipoMensagem.MANTERRESERVA;
		reserva = new Reserva();
		setTipoManterReserva(tipoManterReserva);
	}
	
	@Override
	/**
	 * Envia os dados da reserva
	 * @param stream stream com os dados a serem enviados
	 */
	public void marshal(IStream stream) throws MarshallableException {
		super.marshal(stream); 								// Envia o tipo da mensagem
		stream.write(getTipoManterReserva());				// Envia o subtipo da mensagem
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");	// Cria um formatador de data
		String dtIni, dtFim;
		switch(getTipoManterReserva()){
		case 1:
			stream.write(reserva.getHospedeId().getCpf());				// Envia o nome do hospede da reserva
			dtIni = sdf.format(getReserva().getDataInicio());			// Transforma a data de início em string
			stream.write(dtIni);										// Envia a data de início
			dtFim = sdf.format(getReserva().getDataFim());				// Transforma a data de saída em string
			stream.write(dtFim);										// Envia a data da saída
			stream.write(reserva.getValorEntrada());					// Envia o valor da entrada da reserva
			stream.write(reserva.getAp().getNumero());					// Envia o numero do ap
			break;
			
		case 2:
			stream.write(reserva.getHospedeId().getCpf());				// Envia o nome do hospede da reserva
			dtIni = sdf.format(getReserva().getDataInicio());			// Transforma a data de início em string
			stream.write(dtIni);										// Envia a data de início
			break;
			
		case 21:
			stream.write(reserva.getHospedeId().getCpf());				// Envia o nome do hospede da reserva
			dtIni = sdf.format(getReserva().getDataInicio());			// Transforma a data de início em string
			stream.write(dtIni);										// Envia a data de início
			dtFim = sdf.format(getReserva().getDataFim());				// Transforma a data de saída em string
			stream.write(dtFim);										// Envia a data da saída
			stream.write(reserva.getValorEntrada());					// Envia o valor da entrada da reserva
			stream.write(reserva.getAp().getNumero());					// Envia o numero do ap
			break;
			
		case 3:
			break;
			
		case 5:
			stream.write(reserva.getHospedeId().getCpf());				// Envia o nome do hospede da reserva
			dtIni = sdf.format(getReserva().getDataInicio());			// Transforma a data de início em string
			stream.write(dtIni);										// Envia a data de início
			break;
		}
	}
	
	@Override
	public void unmarshal(IStream stream) throws MarshallableException {
		// Extrai o tipo da mensagem
		//super.unmarshal(stream);
		
		// extrai o subtipo da mensagem
		setTipoManterReserva(stream.readInt());
		
		// Cria um formato de data
		SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");
		
		// Trata o subtipo da mensagem
		switch(tipoManterReserva){
		
			// Mensagem do tipo cadastrar reserva
			case 1:
			
				// Extrai o CPF do hospede da reserva
				this.reserva.getHospedeId().setCpf((String)stream.readObject());
				
				try {
					// Le e seta a data de início
					getReserva().setDataInicio(df.parse((String) stream.readObject()));
					// Le e seta a data de saída
					getReserva().setDataFim(df.parse((String) stream.readObject()));
				} catch (ParseException e) {
					e.printStackTrace();
				}
				// Le e seta o valor pago pela entrada
				getReserva().setValorEntrada(stream.readDouble());
				
				// Le e seta o id do ap
				getReserva().getAp().setNumero(stream.readInt());
				
				break;
				
			case 11:
				break;

			// Mensagem do tipo procurar reserva
			case 2:
				// Extrai o CPF do hospede da reserva
				this.reserva.getHospedeId().setCpf((String)stream.readObject());
				
				try {
					getReserva().setDataInicio(df.parse((String) stream.readObject()));
				} catch (ParseException e) {
					e.printStackTrace();
				}
			
				break;
				
			case 21:
				// Extrai o CPF do hospede da reserva
				this.reserva.getHospedeId().setCpf((String)stream.readObject());
				
				try {
					getReserva().setDataInicio(df.parse((String) stream.readObject()));
					getReserva().setDataFim(df.parse((String) stream.readObject()));
				} catch (ParseException e) {
					e.printStackTrace();
				}
				getReserva().setValorEntrada(stream.readDouble());
				
				// Le e seta o id do ap
				getReserva().getAp().setNumero(stream.readInt());
				
				break;
				
			case 3:
				break;
				
			case 5:
				// Extrai o CPF do hospede da reserva
				this.reserva.getHospedeId().setCpf((String)stream.readObject());
				
				try {
					getReserva().setDataInicio(df.parse((String) stream.readObject()));
				} catch (ParseException e) {
					e.printStackTrace();
				}
			
				break;
				
			default:
				break;
		}
	}

	public Reserva getReserva() {
		return reserva;
	}

	public void setReserva(Reserva reserva) {
		this.reserva = reserva;
	}

	public void setNomeDoHospede(String nomeDoHospede) {
		this.nomeDoHospede = nomeDoHospede;
	}

	public String getNomeDoHospede() {
		return nomeDoHospede;
	}

	public int getTipoManterReserva() {
		return tipoManterReserva;
	}

	public void setTipoManterReserva(int tipoManterReserva) {
		this.tipoManterReserva = tipoManterReserva;
	}
}
